package com.ccjk.beusoft.hot;

import android.os.IBinder;
import android.text.TextUtils;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * Created by CCJK on 2017/12/6.
 */

public class HookServiceHandler implements InvocationHandler {
    private IBinder iClipboard;//这是原始的代理binder,是一个Binder
    Class stub;
    Class interfaceClass;

    public HookServiceHandler(IBinder obj) {
        iClipboard = obj;
        try {
            stub = Class.forName("android.content.IClipboard$Stub");
            interfaceClass = Class.forName("android.content.IClipboard");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


//   实在hook 这个Binder.queryLocalInterface这个点，把IClipboard，替换成我们的
//    public static android.content.IClipboard asInterface(android.os.IBinder obj) {
//        if ((obj == null)) {
//            return null;
//        }
//        android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); // Hook点
//        if (((iin != null) && (iin instanceof android.content.IClipboard))) {
//            return ((android.content.IClipboard) iin);
//        }
//        return new android.content.IClipboard.Stub.Proxy(obj);
//    }

    @Override

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        if (TextUtils.equals(method.getName(), "queryLocalInterface")) {
            //这里本来是应该返回iClipboard 这个原始的代理，但是我们需要做些改变
            return Proxy.newProxyInstance(proxy.getClass().getClassLoader(), new Class[]{interfaceClass}, new ClipboardHookHandler(iClipboard, stub));

        }
        return null;
    }
}
